#include <stdio.h>

// 交换两个元素的值
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 分区函数，选择最后一个元素作为枢轴
int partition(int arr[], int low, int high, int n)
{
    int pivot = arr[high]; // 选择最后一个元素作为枢轴
    int i = (low - 1);     // 较小元素的索引

    printf("Partition: pivot=%d, low=%d, high=%d\n", pivot, low, high); // 分区信息

    for (int j = low; j <= high - 1; j++)
    {
        // 如果当前元素小于或等于枢轴
        if (arr[j] <= pivot)
        {
            i++; // 增加较小元素的索引
            swap(&arr[i], &arr[j]);

            // 打印交换操作
            printf("  Swap arr[%d]=%d and arr[%d]=%d: ", i, arr[i], j, arr[j]);
            for (int k = 0; k < n; k++)
            {
                printf("%d ", arr[k]);
            }
            printf("\n");
        }
    }
    swap(&arr[i + 1], &arr[high]);

    // 打印最终分区结果
    printf("  Final swap: pivot placed at position %d\n", i + 1);
    printf("  After partition: ");
    for (int k = 0; k < n; k++)
    {
        printf("%d ", arr[k]);
    }
    printf("\n\n");

    return (i + 1);
}

// 快速排序主函数
void quickSort(int arr[], int low, int high, int n)
{
    if (low < high)
    {
        // pi是分区索引，arr[pi]现在在正确的位置
        int pi = partition(arr, low, high, n);

        // 分别对分区前后的元素进行排序
        quickSort(arr, low, pi - 1, n);
        quickSort(arr, pi + 1, high, n);
    }
}

int main()
{
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Original array: "); // 原始数组
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n\n");

    quickSort(arr, 0, n - 1, n); // 调用快速排序函数

    printf("\nSorted array: "); // 排序后的数组
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}